home *** CD-ROM | disk | FTP | other *** search
File List | 1992-09-14 | 8.4 KB | 244 lines |
- ' Beispiel für das Lesen und Schreiben von Dateien im IconEdi-format
- '
- ' IconEdi (c) 1991 by Stefan Münch
- '
- ' Achtung : dies ist nur ein Beispiel ! Es finden (fast) keine Fehlerüberprüfungen statt !!
- ' Daher:
- ON ERROR GOSUB ende
- '
- ' Benutzte Variablen:
- '
- ' Strings:
- LET file$=""
- ' Long Integers:
- LET length%=0
- LET length.of.data%=0
- LET address%=0
- LET address2%=0
- LET objectblock.address%=0
- LET object.type%=0
- LET iconblock.address%=0
- LET mask.address%=0
- LET data.address%=0
- LET text.address%=0
- LET bitblock.address%=0
- LET image.address%=0
- LET width%=0
- LET height%=0
- '
- RESERVE 10000 ! reduziert den von GFA-Basic benutzten Speicher,
- ' so daß man Speicher mit MALLOC() anfordern kann
- '
- file$="demoicon.ico" ! Der Name der Icondatei
- ' file$="demoimag.ico" ! Der Name der Imagedatei
- '
- ' ########################################################################################
- ' ## Lesen ##
- ' ########################################################################################
- '
- OPEN "i",#1,file$ ! Dateilänge bestimmen
- LET length%=LOF(#1)
- CLOSE #1
- '
- LET address%=MALLOC(length%) ! Speicher allozieren
- '
- BLOAD file$,address% ! lädt die Datei an die Adresse address%
- '
- IF LONG{address%}=&H49434F4E ! $ 49 43 4F 4E ="ICON" (IconEdi-Format...trara !!)
- '
- ' Die Definition:
- ' $00 char icon_magic[4]; /* enthält "ICON"; $49434F4E */
- ' $04 int icon_version; /* Versionsnummer, wie beim TOS; Start bei
- ' $0000 (=so wie hier vorgestellt) */
- ' $06 int icon_headerlength; /* Länge des Headers in Words, Standard : 6 */
- ' $08 int *objectblock; /* Zeiger auf den Objektblock */
- '
- LET objectblock.address%=LONG{address%+8}+address%
- '
- LET object.type%=WORD{objectblock.address%+6}
- '
- IF object.type%=31 ! Icon
- '
- LET iconblock.address%=LONG{objectblock.address%+12}+address%
- '
- LET mask.address%=LONG{iconblock.address%}+address%
- LET data.address%=LONG{iconblock.address%+4}+address%
- LET text.address%=LONG{iconblock.address%+8}+address%
- '
- LET width%=WORD{iconblock.address%+22}
- LET height%=WORD{iconblock.address%+24}
- '
- PRINT "Die Datei enthält ein Icon."
- PRINT
- PRINT "Der Objektblock liegt an Adresse ";objectblock.address%
- PRINT "Der Iconblock liegt an Adresse ";iconblock.address%
- PRINT
- PRINT "Die Maske liegt an Adresse ";mask.address%
- PRINT "Die Daten liegen an Adresse ";data.address%
- PRINT "Der Text liegt an Adresse ";text.address%
- PRINT
- PRINT "Breite: ";width%
- PRINT "Höhe: ";height%
- '
- ELSE IF object.type%=23 ! Image
- '
- LET bitblock.address%=LONG{objectblock.address%+12}+address%
- '
- LET image.address%=LONG{bitblock.address%}+address%
- '
- LET width%=WORD{bitblock.address%+4}*8
- LET height%=WORD{bitblock.address%+6}
- '
- PRINT "Die Datei enthält ein Image."
- PRINT
- PRINT "Der Objektblock liegt an Adresse ";objectblock.address%
- PRINT "Der Bitblock liegt an Adresse ";bitblock.address%
- PRINT
- PRINT "Das Image liegt an Adresse ";image.address%
- PRINT
- PRINT "Breite: ";width%
- PRINT "Höhe: ";height%
- '
- ELSE
- PRINT "Die Datei ist im IconEdi-Format, enthält aber weder Icon noch Image !!"
- ENDIF
- '
- ELSE
- '
- PRINT "Kein IconEdi-Format !!"
- '
- GOSUB ende
- '
- ENDIF
- '
- ' ########################################################################################
- ' ## Schreiben ##
- ' ########################################################################################
- '
- ' Die Definition:
- ' $00 char icon_magic[4]; /* enthält "ICON"; $49434F4E */
- ' $04 int icon_version; /* Versionsnummer, wie beim TOS; Start bei
- ' $0000 (=so wie hier vorgestellt) */
- ' $06 int icon_headerlength; /* Länge des Headers in Words, Standard : 6 */
- ' $08 int *objectblock; /* Zeiger auf den Objektblock */
- '
- ' Pufferlänge bestimmen:
- '
- LET length.of.data%=DIV(width%,8)*height% ! Länge der Daten (Maske bzw. Daten bzw. Image)
- ' in Bytes
- IF object.type%=31 ! Icon
- LET length%=12+24+36+(length.of.data%*2)+(LEN(CHAR{text.address%})+1)
- ' 12: Header IconEdi-Format
- ' 24: Objektblock
- ' 36: Iconblock
- ' (length.of.data%*2): Länge der Daten und Maske (in Bytes)
- ' (LEN......+1): Länge des Textes inkl. Nullbyte
- ELSE
- LET length%=12+24+14+length.of.data%
- ' 12: Header IconEdi-Format
- ' 24: Objektblock
- ' 14: Bitblock
- ' length.of.data%: Länge des Images (in Bytes)
- ENDIF
- '
- address2%=MALLOC(length%) ! Speicher allozieren
- '
- ' Header setzen:
- LONG{address2%}=&H49434F4E ! "ICON"
- WORD{address2%+4}=0 ! icon_version
- WORD{address2%+6}=6 ! icon_headerlength
- LONG{address2%+8}=12 ! *objectblock
- '
- IF object.type%=31 ! Icon
- '
- ' Objektblock setzen:
- BMOVE objectblock.address%,address2%+12,22 ! erstmal den alten kopieren und ...
- ' ... dann die nötigen Werte ändern:
- WORD{address2%+12}=0 ! ob_next
- WORD{address2%+14}=65535 ! ob_head
- WORD{address2%+16}=65535 ! ob_tail
- WORD{address2%+18}=31 ! ob_type
- ' ob_flags bleiben unverändert
- ' ob_state bleibt unverändert
- LONG{address2%+24}=36 ! ob_spec
- ' ob_x bleibt unverändert
- ' ob_y bleibt unverändert
- ' ob_width bleibt unverändert
- ' ob_height bleibt unverändert
- '
- ' Iconblock setzen:
- BMOVE iconblock.address%,address2%+36,36 ! erstmal den alten kopieren und ...
- ' ... dann die nötigen Werte ändern:
- LONG{address2%+36}=72 ! ib_pmask
- LONG{address2%+40}=72+length.of.data% ! ib_pdata
- LONG{address2%+44}=72+2*length.of.data% ! ib_ptext
- ' char bleibt unverändert
- ' xchar bleibt unverändert
- ' ychar bleibt unverändert
- ' xicon bleibt unverändert
- ' yicon bleibt unverändert
- ' wicon bleibt unverändert
- ' hicon bleibt unverändert
- ' xtext bleibt unverändert
- ' ytext bleibt unverändert
- WORD{address2%+66}=6*LEN(CHAR{text.address%}) ! ib_wtext
- WORD{address2%+68}=8 ! ib_htext
- WORD{address2%+70}=0 ! ib_rsvd
- '
- ' Maske kopieren:
- BMOVE mask.address%,address2%+72,length.of.data%
- ' Daten kopieren:
- BMOVE data.address%,address2%+72+length.of.data%,length.of.data%
- ' Text kopieren:
- CHAR{address2%+72+2*length.of.data%}=CHAR{text.address%}
- '
- ELSE IF object.type%=23 ! Image
- '
- ' Objektblock setzen:
- BMOVE objectblock.address%,address2%+12,22 ! erstmal den alten kopieren und ...
- ' ... dann die nötigen Werte ändern:
- WORD{address2%+12}=0 ! ob_next
- WORD{address2%+14}=65535 ! ob_head
- WORD{address2%+16}=65535 ! ob_tail
- WORD{address2%+18}=23 ! ob_type
- ' ob_flags bleiben unverändert
- ' ob_state bleibt unverändert
- LONG{address2%+24}=36 ! ob_spec
- ' ob_x bleibt unverändert
- ' ob_y bleibt unverändert
- ' ob_width bleibt unverändert
- ' ob_height bleibt unverändert
- '
- ' Bitblock setzen:
- BMOVE bitblock.address%,address2%+36,14 ! erstmal den alten kopieren und ...
- ' ... dann die nötigen Werte ändern:
- LONG{address2%+36}=50 ! bi_pdata
- WORD{address2%+40}=DIV(width%,8) ! Breite in Bytes
- WORD{address2%+42}=height% ! Höhe in Pixeln
- ' bi_x bleibt unverändert
- ' bi_y bleibt unverändert
- ' bi_color bleibt unverändert
- '
- ' Image kopieren:
- BMOVE image.address%,address2%+50,length.of.data%
- '
- ENDIF
- '
- BSAVE file$,address2%,length%
- '
- GOSUB ende
- '
- PROCEDURE ende
- IF address2%>0
- VOID MFREE(address2%)
- ENDIF
- IF address%>0
- VOID MFREE(address%)
- ENDIF
- '
- RESERVE
- '
- END
- '
- RETURN
-